package com.wsm.controller;


import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

@ServerEndpoint(value = "/chat",configurator = GetHttpSessionConfig.class)
@Component
public class ChatEndPoint {
    private static final Map<String,Session> onlineusers = new ConcurrentHashMap<String,Session>();
    private HttpSession httpSession;
    @OnOpen
    public void onOpen(Session session, EndpointConfig config){
        //1.将Session 进行保存
        this.httpSession = (HttpSession) config.getUserProperties().get("wsm");
        String user = (String) this.httpSession.getAttribute("user");//这个得看前端登录的时候怎么存的
        onlineusers.put(user,session);
        //2.广播消息。需要将登录的用户通知给所有用户。
        broadcastAllUser(getFriends().toString());
    }

    private Set getFriends() {
        return onlineusers.entrySet();
    }

    //推送消息
    private void broadcastAllUser(String message){
        //遍历map集合
        Set<Map.Entry<String,Session>> entries  = onlineusers.entrySet();
        for(Map.Entry<String,Session> entry :entries){
            //取到所有用户对应的seesion对象
            Session session = entry.getValue();
            //发送消息
            try {
                session.getBasicRemote().sendText(JSON.toJSONString(message));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 浏览器发送消息到服务端 该方法会被调用
     * @param message
     */
    @OnMessage
    public void OnMessage(String message){
        Message msg = JSON.parseObject(message, Message.class);
        //获取 消息接收方的用户名
        String toName = msg.getToName();
        String mess = msg.getMessage();
        try {
            onlineusers.get(toName).getBasicRemote().sendText(JSON.toJSONString(mess));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 连接被断开时会被调用
     * @param session
     */
    @OnClose
    public void OnClose(Session session){
        //从 onlineUsers 中剔除 当前用户的  session 对象
        String user = (String) this.httpSession.getAttribute("user");//这个得看前端登录的时候怎么存的
        onlineusers.remove(user);

        //通知其他所有的用户 当前用户下线了。
        broadcastAllUser(getFriends().toString());

    }
}
